home *** CD-ROM | disk | FTP | other *** search
- /************************************************************************
- * *
- * Copyright (c) 1987, David B. Wecker *
- * All Rights Reserved *
- * *
- * This file is part of DBW_Render *
- * *
- * DBW_Render is distributed in the hope that it will be useful, but *
- * WITHOUT ANY WARRANTY. No author or distributor accepts *
- * responsibility to anyone for the consequences of using it or for *
- * whether it serves any particular purpose or works at all, unless *
- * he says so in writing. Refer to the DBW_Render General Public *
- * License for full details. *
- * *
- * Everyone is granted permission to copy, modify and redistribute *
- * DBW_Render, but only under the conditions described in the *
- * DBW_Render General Public License. A copy of this license is *
- * supposed to have been given to you along with DBW_Render so you *
- * can know your rights and responsibilities. It should be in a file *
- * named COPYING. Among other things, the copyright notice and this *
- * notice must be preserved on all copies. *
- ************************************************************************/
-
- Sections
- ~~~~~~~~
- Announcement - announcement of software availability
- Included - what's in the package
- Under Development - what's currently being written
- Background Info - what is this package?
- Running RAY - how to run the ray tracer
- Running RAY2 - how to run the post-processor
- Running DISPLAY - how to run the display program
- Creating a .DAT file- what goes into the input file (the hardest part)
- Source file info - how to rebuild the package
-
- Announcement
- ~~~~~~~~~~~~
- If you liked the ray traced images previously distributed... you're
- going to LOVE DBW_Render. This package is a FULL re-implementation of the Ray
- Tracer that I've been using on VAXen to create all those images.
-
- It will run on a standard Amiga (with 512k of memory (and can be configured
- to run in 256k if necessary)). By adding AI-heuristics, elapsed time to
- compute an image is within the same order of magnitude as a VAX-780 (even
- though the Amiga doesn't have hardware floating point or virtual memory)!
- For example "glass" computes in 50 hours on an Amiga without the heuristics.
- With the heuristics, the image (at full resolution) can be computed in 11
- hours.
-
- Included:
- ~~~~~~~~~
- RAY - ray tracing program
- RAY2 - post processor to create IFF/ILBM format files
- DISPLAY - general display program for RAY2's output
- *.DAT - sample input files
- *.TMP - sample RAY output files
- *.ILBM - sample HAM encoded pictures (RAY2 output)
- *.c - all MANX-Aztec C sources for the package
- *.h - all MANX-Aztec C include files for the package
- RAY.DOC - full documentation for the package
- COPYING - General License Agreement
-
- Please read the General License Agreement (file: COPYING) before proceeding.
-
- Under Development
- ~~~~~ ~~~~~~~~~~~
- Depending on the level of interest in this software, I will continue work on:
-
- DBW_ED3D a full 3-dimensional graphics editor (so you don't have to
- mathematically specify the input file to RAY, you can just
- draw it).
-
- DBW_FILM which creates a film loop of HAM images (so you can create
- your own "juggler" type demos).
-
- ---- a version of the software using increased memory and
- floating point co-processor.
-
- ---- maintenance and enhancements to the current package.
-
- Background Information
- ~~~~~~~~~~ ~~~~~~~~~~~
- The DBW_Render package uses an algorithm called Distributed Ray Tracing.
- In addition to neatly solving the hidden surface problem, ray tracing
- (in general) affords the opportunity for doing excellent (that is,
- highly realistic) shading and illumination calculations.
-
- This package is written in MANX-Aztec C and runs on any AMIGA system. The
- RAY program knows how to create images composed of four primitive
- geometric objects: spheres, parallelograms, triangles, and flat circular
- rings (disks with holes in them). Some of the features of the program
- are:
-
- Determination of correct shadows cast by arbitrarily shaped objects,
- onto arbitrarily shaped objects, due to arbitrarily placed light
- sources.
-
- Diffuse and specular reflections (with arbitrary levels of gloss or
- polish). Rudimentary modeling of object-to-object diffusely
- reflected light is also implemented, that among other things
- accurately simulates color bleed effects from adjacent contrasting
- colored objects.
-
- Mirror reflections, including varying levels of mirror smoothness
- or perfection.
-
- Refraction and translucency (which is akin to variable microscopic
- smoothness, like the surface of etched glass).
-
- Two types of light sources: purely directional (parallel rays from
- infinity) of constant intensity, and spherical sources (like light
- bulbs, which cast penumbral shadows as a function of radius and
- distance) where intensity is determined by the inverse square law.
-
- Photographic depth-of-field. That is, the virtual camera may be
- focused on a particular object in the scene, and the virtual
- camera's aperture can be manipulated to affect the sharpness of
- foreground and background objects.
-
- Solid texturing. Normally, a particular object (say a sphere) is
- considered to have constant properties (like color) over the entire
- surface of the object, often resulting in fake looking objects.
- Solid texturing is a way to algorithmically change the surface
- properties of an object (thus the entire surface area is no longer of
- constant nature) to try and model some real world material.
- Currently the program has built in rules for modelling wood, marble,
- bricks, snow covered scenes, water (with arbitrary wave sources),
- plus more abstract things like color blend functions.
-
- Fractals. The program implements what's known as recursive triangle
- subdivision, which creates all manners of natural looking surface
- shapes (like broken rock, mountains, etc.). The character of the
- fractal surface (degree of detail, roughness, etc.) is controlled by
- parameters fed to the program.
-
- AI heuristics to complete computation of a scene within a user
- specified length of time.
-
- When the RAY program runs, it reads a sort of command file, that contains a
- geometric description of the scene to be rendered, plus desired global
- lighting conditions, camera parameters, etc. Then the program computes for
- a long time, writing each scan line to disk as it computes it. The format of
- a scanline (in the .TMP) file is:
-
- <line number> - 2 bytes long
- <red pixels> - 160 bytes long (4 bits per pixel)
- <green pixels> - 160 bytes long
- <blue pixels> - 160 bytes long
-
- For an entire screen (400 scan lines) this file is 192,800 bytes. A second
- program is run (RAY2) to obtain one of three possible output files:
-
- 4096 colors (HAM) encoded interlaced 320x400 resolution
- 32 colors interlaced 320x400 resolution
- 32 colors 320x200 resolution
-
- All of the file formats are standard IFF/ILBM and may be displayed by the
- supplied DISPLAY program. In addition, the last version (320x200) may be
- edited by any standard graphic package (e.g., DPaint). Others may be
- able to handle the more complex first two.
-
- In all, the DBW_Render package represents about 4000 lines of C code.
- It is largely based on original algorithms for the VAX by Tom Dahl and
- Tone Engel at Digital Equipment Corporation. The AMIGA version has taken
- several months to create.
-
- Running RAY
- ~~~~~~~~~~~
-
- REMINDER: BEFORE RUNNING ANYTHING MAKE SURE YOU BACKUP THIS DISK!!!
-
- Once you have an input file (described below in the "Creating a .DAT file"
- section) you can run the ray tracer. Remember that the output of the
- Ray Tracer (for a full screen) will be 192,800 bytes or a little over
- 400 blocks so make sure you have enough free space on the disk you are
- running on. It is NOT suggested that you direct the output to RAM: since
- if the machine crashes you will lose all of your work. In addition make
- sure you have a STACK of at least 10000 before you start!
-
- If you have a file called GLASS.DAT for input, you can type:
-
- 1> ray glass
-
- The program will start running. All of the options are in the .DAT file.
- See the file GLASS.DAT (distributed with the package) for an example.
- As the program runs, it will write to the file GLASS.TMP. If you want
- different names for the input and output files, then run the program with
- no parameters:
-
- 1> ray
-
- at which point you will be prompted for the input file:
-
- Scene description file?
-
- to which you could answer GLASS.DAT. The program will then ask for the
- name of the output file:
-
- File name to save picture (.tmp)?
-
- to which you could answer DF1:GLASS.TMP.
-
- The program will now compute the picture. Note that 4 extra scan lines
- before and after your scene are ALWAYS computed, so if you told the program
- to do a full screen (command "& 0 400" in the command file) you will notice
- that the program will start at scan line -4 and will and at scan line 403.
- This is due to one requirement of the AI-heuristics to fill a scan line cache
- before output can occur.
-
- When the program finishes, it will give you a bunch of statistics about
- the picture. One of the most interesting is the number of pixels GUESSED as
- opposed to the number of pixels COMPUTED. This will give you and idea of how
- high a quality output to expect (0 guessed = perfect). These numbers are
- affected by the amount of time you give the program to compute the
- picture in ("R" command in the command file).
-
- Running RAY2
- ~~~~~~~ ~~~~
- After RAY has completed, the output .TMP file (or files) may be
- post-processed by RAY2. Multiple files may be given to RAY2 for several
- reasons:
-
- 1) The machine crashed and so you have one partial file and another
- that has the rest of the scan lines in it.
-
- 2) You decided to do the picture in strips and have a seperate file
- for each strip.
-
- 3) You did the entire picture, but there are blurry scan lines around
- complex objects (like light sources) because you didn't give it
- enough time... so you recomputed the bad sections allowing more
- time.
-
- These will become clearer as we do the examples. To run the program, type:
-
- 1> ray2 glass
-
- this will open file GLASS.TMP (which was output from RAY), scan the file
- finding the most used colors, open a custom screen, create a HAM mode image
- on the screen and will then read back the image from the screen creating
- GLASS.ILBM. When the program is done, it will flash the screen at which point
- you can hit the (invisible) close gadget in the upper left corner to exit
- the program.
-
- While the program is creating the output file, it will complement the first
- pixel on each scan line it computes so that you can see its progress through
- the picture.
-
- An example of using ALL options for the RAY2 program is:
-
- 1> ray2 -c 1 -h 1 -l 1 -o glass.ilbm glass
-
- Where the options are:
-
- -c = is compression allowed (0 or 1) (default = yes = 1)
- -h = is HAM mode to be used (0 or 1) (default = yes = 1)
- -l = is LACE mode to be used (0 or 1) (default = yes = 1)
- -o = name of the output file to create
- <name> = upto 10 input file names
-
- The example shown will create an image exactly like the previous example
- (since all defaults are being taken). If we wanted the simplest picture
- (that something like DPaint could edit) and we had several input files,
- we could type:
-
- 1> ray2 -h 0 -l 0 -o glass.pic glass1 glass2 glass
-
- In this example we are using multiple input files. The program will ALWAYS
- use scanlines from files earlier in the command line (if possible). So for
- example, GLASS.TMP (on the distribution disk) contains a 12 hour complete
- picture. GLASS1.TMP and GLASS2.TMP contain scanlines around the light sources
- (that are blurry in GLASS.TMP) but with a resolution of 24 hours (so that
- they're much better (each took between 1 and 2 hours to compute)).
-
- This program also uses a heuristic to figure out how to fold 4096 colors
- into 32 when you turn HAM mode off.
-
- Running DISPLAY
- ~~~~~~~ ~~~~~~~
- DISPLAY is a VERY simple program to run, all you need to say is:
-
- 1> display glass
-
- and GLASS.ILBM will get displayed. If you have a different extension, then
- type the full file name:
-
- 1> display glass.pic
-
- The picture will be displayed until you click the mouse on the invisible
- close gadget in the upper left corner of the screen. Remember that you can
- use Left-Amiga-N and Left-Amiga-M to push this screen behind the Workbench
- and pull it back in front.
-
- Creating a .DAT file
- ~~~~~~~~ ~ ~~~~ ~~~~
- Okay, now the hard part: the contents of the script input file. The
- file is a standard ASCII text file, with each line forming a separate
- object or command to RAY. The lines begin with a command character
- (which is CASE SENSITIVE). The command characters are:
-
- R Set resolution (optional, if missing, program will default to 12.0 hours)
- N Global index of refraction (optional, default = 1.0)
- Z Produce 2D histogram, rather than true image (default true image)
- a Set overriding ambient proportion factor (default not overridden)
- A Set antialiasing parameters (default no antialiasing)
- F Set lens focus and aperture for depth of field (default infinite depth)
- M Set global diffuse lighting parameters (default off)
- & Define scan-line region of image to generate
- *,! comment, ignored
- b Set background color
- w Define a wave source
- g Define a color blend texture
- n Define a snowfall texture
- k Define a 3D checkerboard texture
- H Set global haze parameters (default no haze)
- f Define fractal surface parameters
- m Define a marble texture
- d Define a wood texture
- e Set the eye (camera) view parameters
- l Define a directional light source
- L Define a spherical light source
- { Start an extent
- } Terminate an extent
- s Specify a spherical object
- t Specify a planar triangular object
- x Specify a fractal triangular object
- q Specify a planar paralleligram object
- r Specify a planar ring (annular) object
-
- First, all color values consist of three numbers that range from 0 to 1.
- The color components are specified BLUE, GREEN, RED.
-
- All position/direction values are three numbers ranging in whatever numbering
- system you want. The numbers are X, Y, Z order. Assuming you are
- looking into the screen in the negative Z direction, positive X is to
- the right, positive Y is up, and positive Z is out from the screen.
-
- Okay, on to the specifics of the parameters that each command character
- requires. First are listed all the general (environmental) commands, then
- are listed the commands that create objects to be rendered in the scene.
-
- Global index of refraction (optional, default = 1.0)
- N INDEX
- This single value is taken to be the index of refraction of "the
- air", or put another way of the space between and outside of all
- objects.
-
- Set resolution (optional, default = 12.0 hours)
- R RESOLUTION
- The RESOLUTION value controls the MAXIMUM amount of time that a full
- screen (400 scanlines) is allowed to take. This number should typically
- be between 1.0 and 30.0 hours. The more time you give the program the
- better the picture will be that you get.
-
- Produce 2D histogram, rather than true image
- Z FLAG
- Normally, the contents of the .TMP file that the ray tracer produces
- is a binary pixel version of the described scene. However, for the
- purposes of doing performance tuning of an antialiased scene, you can
- include the command "Z 1" in the script file. If done, the image file
- that the ray tracer generates will not be the color scene that it
- normally is, but instead will be a sort of 2D histogram of how much
- computation each pixel in the scene consumed, displayed as a gray scale
- (the brighter the pixel, the more computation). Note that this command
- is only meaningfull if non-default values for the "A" command have been
- used. By default, basically an equal amount of time is spent on each
- pixel, (thus an image with Z set to 1 would come out a flat gray) but
- the "A" command tells the ray tracer to concentrate on certain types of
- details in the scene to produce alias-free images. Using the Z command
- with a parameter of 1 will allow you to see just where the ray tracer
- decided to spend more time, smoothing edges, etc.
-
- Set overriding ambient proportion factor
- a FACTOR
- As described below, each object in the scene contains parameters that
- control how bright the object appears if no light is shining on it. Thus
- you can set some objects to appear brigher when in shadow that other
- objects. As an alternative, you can specify the "a" command with a
- parameter from 0 to 1, and this will cause the ambient color of all
- objects in the scene to be a fraction of their diffuse brightness.
- When the "a" command is used, the BGR ambient values for each object are
- ignored (but they must still be specified). A reasonable starting point
- would be to set FACTOR from between .1 and .2.
-
- Set antialiasing parameters
- A COUNT THRESHHOLD
- By default, the ray tracer computes one ray into the scene for each pixel
- in the image (so a 320X4000 image computes ~128K rays). Quite often,
- some unpleasant side effects of the digital generation process become
- apparent in a scene generated with one ray per pixel, for example
- diagonal lines are rendered as a sequence of discrete stairsteps -- the
- dreaded jaggies. Such false features are called aliasing defects. There
- are numerous techniques devised to try to reduce the magnitude of these
- defects, collectively referred to as the process of anti-aliasing.
- (There are many other types of aliasing defects besides jaggies. An
- example of another "defect" is the razor-sharp shadows that are
- traditionally found in computer generated imagery -- real-world shadows
- are always at least a teensy bit diffuse.)
-
- The COUNT parameter determines how many rays will be traced for each
- pixel in the scene -- the more, the better, but the slower the computing.
- A good starting value is 4. What happens is that a bunch of rays (e.g. 4)
- are sent into the pixel cone at random -- they are "distributed" across
- the horizontal and vertical dimensions. Thus, this ray tracer is said to
- implement Distributed Ray Tracing.
-
- The THRESHHOLD value relates to a rather complicated feature in the ray
- tracer called Statistically Optimized Distributed Ray Tracing. The way
- this works is that the program computes the intensities of the bunch of
- rays that are distributed into the pixel. In this example, say there are
- four rays in the bunch. The program computes the statistical variance of
- the four resulting intensities. If the variance is small, the odds are
- that the portion of the scene being imaged is a smooth patch.
- Thus a good approximation to the ideal intensity of that pixel has been
- computed. But let's say that the pixel happens to fall on a diagonal
- edge. Some of the distributed rays will be cast to one side of the edge,
- and some of them to the other. Thus the variance will be high. The
- program looks at this, and if the variance is past the THRESHHOLD value,
- will distribute another group of (in this case) four rays into the pixel.
- Then the variance of the eight rays will be examined, and the process
- repeated until the required smoothness has been reached (or some
- arbitrarily large number of rays have been cast, and the process halts).
- Setting THRESHHOLD to value of 1.0 or higher generally will force no
- extra groups of rays to be cast, beyond the initial group of COUNT rays.
- Meaningfull values of THRESHHOLD generally fall in the .0001 to .1 range.
-
- Set lens focus and aperture for depth of field
- F APERTURE FOCUS
- This command is optional; if omitted, the scene will be rendered such
- that all objects will be in perfect focus (a pin-hole camera effect).
- With this command, you can add depth-of-field effects to a scene (though
- at great computation speed degradation, as described below).
- The APERTURE parameter specifies the radius of the hypothetical lens
- in the camera that is taking the picture of the scene. FOCUS sets the
- distance from the camera (or eye) at which objects will appear in perfect
- focus. The magnitude of both values depends upon the coordinate system
- in use by your scene, of course, but here is an example for determining a
- reasonable camera aperture. Say that one unit of distance represents an
- inch. Assume you set the focus distance to 100 inches; with this scale,
- a reasonable value for aperture is 0.5 to 2.0.
-
- In order to achieve a good quality smooth blurring of the foreground and
- background, you will need to set the antialiasing parameters up from
- their defaults (with the A command). A good start would be 20 to 30
- rays per pixel; the THRESHHOLD value doesn't matter much; it could be
- set to 1.
-
- Set global diffuse lighting parameters
- M COUNT NUMERATOR DENOMINATOR
- This command relates to the realistic propagation of light as it reflects
- from object to object in the scene. Traditionally, computer lighting
- models operate such that if an object is directly visible from a light
- source, then the surface of the object is colored according to the
- material's properties, the color and strength of the light, etc. For
- those objects or portions of objects that are not in the path of a light
- source (aka are in shadow), they are rendered black. Well, this is
- usually artificial looking, and so a constant dim color is assigned to
- areas in shadow. (In fact, this program has provisions for this as well,
- the ambient parameters of each object, plus the "a" command.)
-
- But in reality, shadows are filled in with light bounced off walls, etc.
- The M command can be employed to model this diffuse propagation of light
- from object to object. (Sadly, once again performance suffers
- significantly if you choose to do this, since a great deal of information
- about the scene needs to be collected and analyzed to determine how the
- shadow fill-in should occur.) How this program does this is to, for each
- pixel, sample extra rays from the surface being rendered, out into the
- scene in random directions to see what other nearby surfaces are acting
- as reflectors, etc. The COUNT parameter controls how many samples to
- take per pixel; values from 10 on up are okay, but 100 or more are needed
- to render smooth color bleeding from surface to surface, etc.
- The NUMERATOR and DENOMINATOR derive from the recursive nature of the
- ray tracing process: in the process of calculating a ray on the surface
- being rendered, assume the ray strikes an adjacent surface. Well, from
- THAT surface, another COUNT set of rays will ne sampled, to determine
- ITS color, etc.; thus the process exponentially generates rays that need
- to be computed. To avoid this recursive growth, the number of sample
- rays that are done per recursion level is scaled from the initial COUNT
- value, according to the supplied NUMERATOR and DENOMINATOR values. For
- example values of 1 and 2 respectively will reduce by half the number of
- samples taken at each recursion level. Normally, even this is not a fast
- enough decay, so 1/3 or 1/4 is better, without much noticable loss in
- resulting color fidelity. In fact, setting NUMERATOR to 0 is not
- unreasonable.
-
- Define scan-line region of image to generate
- & FIRST LAST
- If this command is omitted, the entire image bitmap will be calculated
- (all 400 scan lines). This command tells the program only to produce
- those scans from FIRST to LAST-1 inclusive. Once done, the resulting
- fragment images can be combined into one whole image file. In this way,
- a particularly complex scene may be distributed into a number of CPUs,
- resulting in shorter elapsed generation time. Picture merging is
- accomplished by RAY2).
-
- Set background color
- b BLUE GREEN RED
- The simple color value that will be displayed if no objects are
- visible at a given point in the scene.
-
- Define a wave source
- w CENTERX CENTERY CENTERZ WAVELENGTH AMPLITUDE DAMP PROPAGATE
- A number of features in the program use wave sources as a basis for
- calculating various effects (most notably the production of rippled
- surfaces, such as water). You can define up to 100 wave sources per
- scene. There is only one "wave source table" stored by the program;
- all of the features that use waves use the same waves.
- The first three values specify the coordinate from which the concentric
- wave fronts emanate from. WAVELENGTH sets the crest-to-crest distance
- for the wave. The AMPLITUDE value determines, in an abstract manner,
- the height of the wave at the origin. The height is not specified in
- normal distance units; rather it is a fixed scale frational value, in the
- approximate range of 0.1 (small, flat waves) to 0.5 (strong waves).
- The DAMP value controls the damping of successive trains of waves. The
- value 1.0 means no damping; the waves will contine out to infinity from
- the source. Value 0.7 means that successive crests will be 70% the
- height of the preceeding crest. The PROPAGATE value controls what phase
- the wave starts broadcasting at; the value ranges from 0.0 (starting at a
- crest at the origin) through 0.5 (180 degrees out of phase -- a trough)
- and back to 1.0 (a crest). This can be used in sequenced frames to
- produce moving waves.
-
- Define a color blend texture
- g BCOLOR GCOLOR RCOLOR START RANGE
- Normally, an object is solidly and uniformly colored across its entire
- surface. This command lets you define a blend function which can be
- applied to any object, in such a manner that the color of the object
- will vary as a function of altitude (Y coordinate). For example, a
- sphere could be blue at the south pole, and yellow at the north pole,
- with the color smoothly changing in the middle.
- You can define up to ten blends per scene.
- The three COLOR values specify the target color that the surface will
- blend to with increasing Y coordinate (the initial color of the object
- at low Y coordinate values is taken from the diffuse coeficients of
- the object, as defined a ways below in the section on object properties).
- The START value defines the low-Y coordinate where blending starts;
- surface points below this Y level will be colored with the objects
- diffuse coeficients. The blending continues from START, continuing for
- RANGE units upward. At the level of START+RANGE, the blend would have
- saturated out at the new COLOR value. Points above START+RANGE will
- maintain the new COLOR. As an example, consider a sphere of radius
- 100 units positioned at the origin. If START was set to -33, and RANGE
- was set to 66, the result would be that the lower third of the sphere
- would be its base diffuse color; the middle third would gradually change
- color up until at the +33 level the color would attain the new COLOR;
- the upper third of the sphere would maintain the new COLOR.
-
- Define a snowfall texture
- n START ALTITUDERANGE ALTFACTOR THRESHHOLD
- This texture function is similar to the above blend texture. It is
- still under development. This is intended to be used with the fratcal
- surface capabilities described below. The theory is that this will
- distribute snow onto an object, the nature of which varies according to
- the local surface slope and altitude.
- START is the lower bound below which there can be no snowfall
- accumulation, even on level surfaces. Points on the surface above the
- level of START+ALTITUDERANGE generally are solidly blanketed with snow.
- ALTFACTOR is a scaler that lets you determine how important altitude is
- in determining snow cover; value 0 means it is irrelevant (thus it is
- just a function of local surface slope). Values above 1.0 generally
- result in a faster buildup of snow at the low end of the ALTITUDERANGE
- scale. THRESHHOLD controls when a surface will be solidly blanketed, if
- it meets the threshhold test. Values for this parameter range from 0.0
- (at which everything from START and above will be solidly coated,
- regardless of slope) to 1.0, where coverage will be a continuous function
- of slope and altitude. Values around .4 result in surfaces from about
- 40 degrees of slope and flatter to be solidly covered.
-
- Define a 3D checkerboard texture
- k BCOLOR GCOLOR RCOLOR X Y Z JUNK1 JUNK2 JUNK3
- You can define up to 10 checker textures per scene.
- This texture function determines the color of points on the surface of
- an object, using a 1- (layer), 2- (checker, column), or 3-dimensional
- (block) model. As the points on the surface of an object are colored,
- this texture function can be used to determine whether the color of the
- point in question is the object's base diffuse color, or is a different
- specified color (controlled the three COLOR parameters to this command).
- To determine whether the surface point is inside or outside which color
- region, the X Y Z pattern size values are checked. The X parameter
- defines the width of successive layers from left to right; Y defines the
- width of successive layers from top to bottom; Z is for front to back.
- Note that one or more X Y or Z values can be set to 0. This will cancel
- any variation in the pattern in the corresponding dimention. For example, if X and Z are set to 10 but Y is 0, the effect will be of square
- vertical columns of alternating color. If only Y were non-zero, the
- effect would be of horizontal layers of alternating color. Setting all
- three to non-zero creates a solid 3D block pattern. The width of the
- layers in X Y and Z need not be the same (so you can make long flat
- blocks, for example).
- JUNK1, JUNK2, and JUNK3 are currently not used and should be set to 0.
-
- Set global haze parameters
- H BCOLOR GCOLOR RCOLOR DISTANCE
- If this command is omitted, the color of each pixel in the scene is not
- affected by how far the rendered surface is from the eyepoint. By using
- this haze command, you can cause objects in the distance to be
- progressively tinted to a specified target haze color (the three COLOR
- values). Objects that are DISTANCE units or farther from the eyepoint
- will be completely tinted or blended to the haze color and thus will
- become effectively invisible. Objects closer than this distance will be
- continuously tinted from their true local color to the haze color, in
- a linear manner as a function of distance.
-
- Define fractal surface parameters
- f RECURSIONLEVEL XSCALE YSCALE ZSCALE FINALTEXTURE
- This texture can only be applied to 'x' objects as defined below.
- The ray tracer so far only knows how to render a small set of primitive
- object shapes, one of which is the three-sided polygon (triangle).
- As described in the 'x' command below, the ray tracer does have the
- capability to algorithmically generate compound objects that are
- constructed out of large numbers of adjacent triangles forming what
- is called a stochastic surface (often thought of as a fractal surface,
- though in fact the relationship to the mathemacits of fractals is
- limited). This command defines parameters that the ray tracer uses in
- constructing the mesh of triangular surface patches.
-
- You can define up to 10 fractal textures per scene. In order to define
- a fractal surface, you must also define at least one wave source with
- the "w" command (the reason for this apparently unrelated need will be
- explained). The general fractal construction procedure is based on
- recursive triangle subdivision, applying complex coordinate shifts when
- determining the vertices of the subdivision triangles. You start with
- one master triangle that controls the gross size and orientation of the
- final surface. The original triangle is split into four triangles (by
- bisecting the three sides and connecting the midpoints). The corners of
- the new triangles are then shifted in space, and they are recursively
- subdivided in turn, to the desired level. The RECUSIONLEVEL sets this
- depth; the higher the depth, the finer the resulting surface, but the
- slower the image will take to compute (on the order of four times with
- each successive level). Plus larger level values require substantial
- quantities of address space to contain the generated triangle data (on
- the order of thousands of 512-byte memory pages for a level of 7,
- for example... so BE CAREFUL!).
-
- The X Y and ZSCALE values allow you to emphasize distortion differenly in
- the three dimensions (X and Z of 1.0, with Y of 3.0 results in three
- times as much vertical relief as horizontal, for example). Values of 0
- for a scale parameter cause the sub-triangles to not move in the
- indicated dimension (X and Y of 0 will make the resulting surface
- maintain a triangular silhouette as seen from above).
-
- The FINALTEXTURE value will be assigned as the texture function number
- for each of the sub-triangles (see the description of texture function
- values for objects below). Basically, this allows you to apply a uniform
- texture to the entire fractal object: a smooth color gradiation, a
- checkerboard, etc.
-
- As mentioned above, to get a good rough fractal surface, you need to
- also define a small number of wave sources. A good starting point is
- to specify five or six wave sources, whose actual XYZ coordinates are
- scattered about the scene. Giving them different wavelenghts and
- amplitudes will increase the fluctuation in the surface. Generally,
- the damping should be small (values of or near 1.0). The actual manner
- in which the waves are utilized in constructing the sub triangle vertices
- is beyond convenient description; suffice it to say that there is NO
- randomness involved, and that different wave patters will produce
- markedly different fractal surfaces. Experment.
-
- Define a marble texture
- m BVEINCOLOR GVEINCOLOR RVEINCOLOR XSCALE TURBULENCE SQUEEZE
- You can define up to ten marble textures per scene. This texture
- relies on your having defined at least one wave source, for reasons
- described below.
-
- The marble is modelled as a base substance that has intrusions of a
- second substance into the base. The base color is determined by the
- diffuse coefficients for the object. The intrusion color is specified
- in the three VEINCOLOR parameters. The actual color for the surface of
- the marble object is a complex blending function of the two starting
- colors.
-
- The basic formula for making the intrusions (veins) is to start with
- equally spaced vertical layers (spaced along the X axis). The spacing is
- determined by the XSCALE parameter (good values are from 0.1 to 1). Then
- turbulence is applied to the layers, deforming them into myriad whorls
- and streaks, etc. The amount of turbulence is set by the TURBULENCE
- parameter (values from 1.0 to 3.0 are nice). The rough thickness of the
- streaks is determined by the SQUEEZE parameter (which must be an integer
- -- no fractional component). The value 1 means leave them normal width;
- 2 means twice as thin; 3 means four times as thin; 4 means eight times,
- etc. Another way to think of SQUEEZE is that it affects how fast the
- blending occurs from the base to the vein color.
-
- The turbulence is controlled by (of all things) the wave sources that you
- have defined in the scene. Unfortunately, the correspondence between a
- particular wave source and a particular turbulent result is almost
- impossible to predict (but it IS possible; there is no randomness
- involved). All that can really be done is to give guidelines for general
- wave parameter values. First, four or five wave sources are needed. The
- wave centers should be well distributed around the scene. The wavelengths
- should vary amongst the source a good amount (some should be five or six
- times the wavelength of other sources). Not much damping should be
- applied (values from 1.0 down to 0.95 perhaps).
-
- Define a wood texture
- d BCOLOR GCOLOR RCOLOR THICKSCALE RINGSCALE TURBULENCE SQUEEZE
- You can define up to ten wood textures per scene. This texture
- relies on your having defined at least one wave source, just like for
- the marble textures listed above. In fact, at this time wood is modelled
- very similarly to marble, except that where marble consists of parallel
- layers of base material, wood consists of concentric cylinders of base
- material (aligned along the Y axis). The RINGSCALE parameter is
- analogous to XSCALE for marble; TURBULENCE and SQUEEZE are the same.
- THICKSCALE basically controls how faint or strong the grain is rendered;
- values above 1.0 enhance the grain; values less than 1.0 subdue the
- grain.
-
-
- Set the eye (camera) view parameters
- e XPOS YPOS ZPOS XVIEW YVIEW ZVIEW XUP YUP ZUP
- First triple sets the position of the eyepoint. Second triple
- defines the direction (relative to that point) that the eye will
- look along to define what is visible. The length of this vector
- determines the "wide-andle vs. telephoto" effect. To guage what
- different lengths mean, at the tip of the VIEW vector the screen is
- projected as if it were 256 units horizontally by 170 units
- vertically. Thus the magnitude of the numbers you choose for XYZ
- points interact with the view vector length to determine the cone
- of visibility. The third triple is the direction you want to be
- "up"; usually 0 1 0 is what you want.
-
- Define a directional light source
- l BLUE GREEN RED XDIR YDIR ZDIR
- The first triple is the color and intesity of the light (1 1 1 would
- be bright white; 0.5 0 0.5 would be dim magenta). The second triple
- is the direction from which the light is comming. For example 1 0 0
- would mean the light is comming in straight along the X axis (from
- positive to negative). You can have at most 100 light sources per
- scene (many light sources sloooows things down -- two is
- reasonable!).
-
- Define a spherical light source
- l BLUE GREEN RED XCENTER YCENTER ZCENTER DISTANCESCALE RADIUS
- The first triple is the color and base intensity of the light, just as
- for directional light sources. The second triple is the XYZ coordionate
- of the center of the spherical light source; it can be anywhere inside
- or outside of the visible scene. (Note that if the center is within the
- scene, it is not a visible object per-se. For example, if you wanted a
- lightbulb, you would place the spherical light source where you wanted
- it, and also place a transparent sphere at the same coordinates and with
- the same radius.) The DISTANCESCALE relates to the inverse-square law
- with which the brightness of the light diminishes within the scene. To
- explain how to set a value for DISTSCALE, consider the following example.
- Say you wanted a full-intensity white lightbulb (i.e. its nominal BGR
- values would be 1 1 1) to shine onto a table. If the table were, say,
- 37 units of distance from the light coordinate, then you'd want to set
- DISTSCALE to 37 in order that the table would be fully illuminated. Thus,
- objects closer to the light that 37 would appear very bright (indeed,
- probably "overexposed") while objects farther than 37 units from the
- light would become increasingly dimly lit. RADIUS is the radius of the
- light emitting sphere; 0.0 would be a point light source. (Note that
- point light sources are faster to compute.) Also note that non-zero
- radius light sources cast penumbral shadows, though to be effective you
- will need to increase the antialias parameters defined by the "A"
- command.
-
- Now for the actual objects that compose a scene. You can about thousand
- objects max per scene. All objects have the same basic properties available
- to them. Specifically, the first portion of the command line for any
- object starts with:
-
- @ TEX FUZZ MIRROR IDX TRA_B TRA_G TRA_R AMB_B AMB_G AMB_R DIF_B DIF_G DIF_R
- "@" is the object command character (s,q,x,t,r).
-
- TEX is an integer value that specified what texture function should be
- applied to this object. Value 0 means no texture (plain, boring evenly
- colored flat surface). Positive values select from among the supported
- texture functions, as follows:
-
- Value Texture function
- ----- ----------------
- 1: Y axis color gradiation
- Compute the color at each point on the surface as a function
- of the point's Y coordinate. Starting at Y=0, the color
- belnds from red to blue to green and back to red at Y=20.
- The colors repeat evern 20 units in Y.
-
- 3: Mottled diffuse
- The brightness of the surface of the object varies to
- form a mottled pattern. This texture requires some wave
- sources to be defined.
-
- 4: Wavy surface
- The surface will be rendered as being criss-crossed by
- overlapping waves. If reflectivity is turned on for the
- object, the reflections will be rippled, etc.
-
- 5: Brick pattern
- The object will be rendered as if it were carved out of
- bricks. The brick size is currently hardwired to be
- height=3.0, width=8.0, depth=4.0, mortar thickness=0.5.
- The color of the bricks is determined by the diffuse
- coefficients for the object; the color of the mortar is
- hardwired at BLUE=0.8, GREEN=0.85, RED=0.99. The bricks are
- aligned with the coordinate system.
-
- 10..19: Single Wave
- This is like texture 4, except that the surface is rippled
- by only one wave (rather than all of them with texture 4).
- Texture 10 means use the first wave, texture 11 means use
- the second wave, etc. up to 19 for the tenth wave.
-
- 20..29: Marble
- Render the object as if it were carved out of marble. The
- marble texture chosen depends on the texture number: texture
- 20 uses the first marble defined, texture 21 uses the second
- marble defined, etc.
-
- 40..49: Wood
- Render the object as if it were carved out of wood. The
- wood texture chosen depends on the texture number: texture
- 20 uses the first wood defined, texture 21 uses the second
- wood defined, etc.
-
- 50..59: Checkered
- Color the surface of the object according the the chosen
- checkerboard texture. Texture 50 uses the first defined
- checker pattern, etc.
-
- 60..69: Fractal
- This isn't a texture per se (in so far as most other textures
- operate by changing the color of surface points of the
- object). This texture determines what fractal surface
- contours should be applied to this object. This texture type
- may only be specified for object type X (fractal objects).
- Texture 6 uses the first defined fractal type, etc.
-
- 70..79: Smooth blend
- Render the surface of the object as a blend between the
- objects normal diffuse color, and the specified blend texture
- color. Texture 70 uses the first defined blend texture, etc.
-
- 80..89: Snow
- Color the surface of the object by applying the chosen
- snowfall texture. Texture 80 uses the first defined snow
- texture, etc.
-
- FUZZ is a pseudo-texture factor 0 to 1 that applies a random fuzz to
- the surface of the object. This can be used in a number of ways: to
- model soft surfaces like tennis balls; to form imperfectly reflecting
- mirrors, to form translucent (etched) glass, etc.
-
- MIRROR is a 0 to 1 value where 0 means no specular and mirror
- reflection, and 1 means 100% specular & mirror reflection.
-
- IDX is the index of refraction for the object. This is only relevant if
- the transparency for the object is non-zero.
-
- TRA_B, _G, _R is the transparency of the object in each color band.
- 0 means opaque, 1 means 100% transparent.
-
- AMB_B, _G, _R is the ambient light value for the object, 0 to 1. 0
- means no pseudo-ambient light, 1 means VERY strong ambient light
- (generally not useful so strong -- washes the object out).
-
- DIF_B, _G, _R is the diffuse reflection values 0 to 1 for the object
- in the color bands. For example, glass has virtually zero diffuse
- reflection, while chaulk has very high (near 1) diffuse reflection.
- The diffuse coefficients determine the color of the object (in
- conjunction with the color of the light sources).
-
- From the above, notice that non-rational objects can be created. For
- example, a ball that is 100% transparent AND 100% reflective.
-
- Now onto each object. The parameters below FOLLOW (appear to the right
- of) all of the above property parameters.
-
- s CENTERX CENTERY CENTERZ RADIUS
- Sphere. Self-explanetory.
-
- q POSX POSY POSZ VE_X VE_Y VE_Z VP_X VP_Y VP_Z
- Parallelogram.
- The position triple defines a corner of the parallelogram. The
- second and third triple are two vectors that define the two sides of
- the object adjacent to and relative to the defining point. Here's
- the hard part: the order of the two vectors matters. To try to put
- it simply, the VE vector is the one on the left when viewed from
- "above," and the VP vector is the one on the right. In another way,
- the VP vector is clockwise from the VE vector. If the two vectors
- are reversed, the object will appear invisble. So you may have to
- experiment by reversing them. Note that the two vectors do not have
- to be orthogonal.
-
- t POSX POSY POSZ VE_X VE_Y VE_Z VP_X VP_Y VP_Z
- Triangle.
- Same as for a parallelegram, except that the VE, VP vectors define
- the two sides of the triangle.
-
- x POSX POSY POSZ POS1X POS1Y POS1Z POS2X POS2Y POS2Z
- Fractal.
- This is very much like a triangle, except that whereas the second and
- third set of XYZ values for triangles are relative to the base position
- of the triangle, for a fractal object all three XYZ triples are absolute
- object space positions.
-
- r CENTERX CENTERY CENTERZ VE_X VE_Y VE_Z VP_X VP_Y VP_Z MINRAD MAXRAD
- Ring (or annullus).
- Rings are sort of like parallelograms. The first triple defines the
- center of the ring. The VE and VP triples radiate from that point
- and define the plane of the ring. It is undefined as to what
- happens if the two vectors are not orthogonal. MINRAD is the inside
- radius of the ring (which may be zero, forming a disk); MAXRAD is
- the outside radius of the ring.
-
- The { and } command lines may be placed around any arbitrary set of
- object command lines. This allows RENDER to do optimized ray tracing by
- calculating extent spheres around the indicated primitive objects and
- then checking ray intersections with the extent sphere rather than
- one-by-one with all the inner objects. Extents may be nested.
-
- Source file information
- ~~~~~~ ~~~~ ~~~~~~~~~~~
- Each program is kept in its own source file directory:
-
- ray_source/
- makefile
- ray.h - all global definitaions
- ray.c - main module of ray tracer
- val.c - current intensity value of an object
- hit.c - calculate if an object gets hit by a ray
- tex.c - calculate the texture of an object
- ext.c - handle extents ({,} commands)
- rnd.c - random number table
- mth.c - perform vector and matrix math
- fil.c - file i/o
- int.c - find intersections with objects
- cal.c - top level object calculations
- ray2_source/
- makefile
- ray2.c - source for post-processor
- display_source/
- makefile
- display.c - source for display package
-
-